package br.padroes.jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.padroes.jdbc.modelo.Titulos;
import br.padroes.jdbc.singlenton.ConnectionFactory;

public class TitulosDAO {

	private Connection connetion;

	public TitulosDAO() {
		/*
		 * Utiliza o método estático getInstance() de ConnectionFactory do
		 * pacote br.padroes.jdbc.singlenton para referenciar o objeto de
		 * ConnectionFactory que é referenciado pela variáve de instância
		 * connection da classe ConnectionFactory.
		 */
		this.connetion = ConnectionFactory.getInstance();
	}

	// Adiciona os dados ao banco
	public void adiciona(Titulos titulo) {
		String sql = "insert into titulos " + "(editora, titulo, genero)"
				+ "values (?, ?, ?)";

		try {
			// prepared statement para a inserção
			PreparedStatement stmt = connetion.prepareStatement(sql);

			// seta os valores
			stmt.setString(1, titulo.getEditora());
			stmt.setString(2, titulo.getTitulo());
			stmt.setString(3, titulo.getGenero());

			// executa
			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// Lista os dados do banco
	public List<Titulos> getLista() {
		try {
			List<Titulos> titulos = new ArrayList<Titulos>();

			PreparedStatement stmt = this.connetion
					.prepareStatement("select * from titulos");
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				// Criando o objeto titulo
				Titulos titulo = new Titulos();
				titulo.setId(rs.getLong("id"));
				titulo.setEditora(rs.getString("editora"));
				titulo.setTitulo(rs.getString("titulo"));
				titulo.setGenero(rs.getString("genero"));

				// adiciona o obejto à lista
				titulos.add(titulo);
			}
			rs.close();
			stmt.close();
			return titulos;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	//Altera dados no banco
	public void altera(Titulos titulo){
		String sql = "update livros.titulos set editora = ?, titulo = ?, " + 
				"genero = ? where titulos.id = ?";
		
		try{
			PreparedStatement stmt = connetion.
					prepareStatement(sql);
			stmt.setString(1, titulo.getEditora());
			stmt.setString(2, titulo.getTitulo());
			stmt.setString(3, titulo.getGenero());
			stmt.setLong(4, titulo.getId());
			stmt.execute();
			stmt.close();
		}catch (SQLException e){
			throw new RuntimeException(e);
		}
	}
	
	//Remove um registro do banco de dados
	public void remove(Titulos titulo){
		try{
			PreparedStatement stmt = connetion.
					prepareStatement("delete from titulos where id=?");
			stmt.setLong(1, titulo.getId());
			stmt.execute();
			stmt.close();
		}catch (SQLException e){
			throw new RuntimeException(e);
		}
	}
}